//
// Created by konglinglong on 2020/9/6.
//

#ifndef CSP_INCLUDE_UTILS_FIXRINGBUFFER_H
#define CSP_INCLUDE_UTILS_FIXRINGBUFFER_H

#include "commDef.h"

#ifdef __cplusplus
extern "C"
{
#endif

/******************************************************************************
 fixed ring buffer : 采用无锁方式实现的定长环形缓冲，提供有边界的数据处理。
                     可用于NONE(没竞争，生产者、消费者为同一线程)、SPSC(单生产者--单消费者)、
                     MPSC(多生产者--单消费者)、SPMC(单生产者--多消费者)、MPMC(多生产者--多消费者)场景。
 ******************************************************************************/

enum
{
    FIX_RB_TYPE_NONE = CSP_CONCURRENCY_TYPE_NONE, /* 没竞争，生产者、消费者为同一线程 */
    FIX_RB_TYPE_SPSC = CSP_CONCURRENCY_TYPE_SPSC, /* 单生产者，单消费者 */
    FIX_RB_TYPE_SPMC = CSP_CONCURRENCY_TYPE_SPMC, /* 单生产者，多消费者 */
    FIX_RB_TYPE_MPSC = CSP_CONCURRENCY_TYPE_MPSC, /* 多生产者，单消费者 */
    FIX_RB_TYPE_MPMC = CSP_CONCURRENCY_TYPE_MPMC, /* 多生产者，多消费者 */
};

typedef struct FixRingBuffer S_FixRingBuffer;

S_FixRingBuffer* FixRB_Create(const char* shmId, uint32_t dataNum, uint32_t dataSize, uint32_t type);
void FixRB_Destroy(S_FixRingBuffer* self);
void* FixRB_WriteRequest(S_FixRingBuffer* self, uint32_t size);
int32_t FixRB_WriteCommit(S_FixRingBuffer* self, void* chunk);
void* FixRB_ReadRequest(S_FixRingBuffer* self, uint32_t* size);
int32_t FixRB_ReadConsume(S_FixRingBuffer* self, void* chunk);
int32_t FixRB_Put(S_FixRingBuffer* self, void* data, uint32_t size);
int32_t FixRB_Get(S_FixRingBuffer* self, void* buffer, uint32_t* size);
uint32_t FixRB_Count(S_FixRingBuffer* self);
void FixRB_Dump(S_FixRingBuffer* self, void* buffer, uint32_t size);


#ifdef __cplusplus
}
#endif

#endif //CSP_INCLUDE_UTILS_FIXRINGBUFFER_H
